﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Scommesse.Persistence;

namespace Scommesse.Model
{
    [Serializable]
    public class BetCard : IBetCard
    {
        private readonly List<ScommessaController> _scommesse;

        public List<ScommessaController> Scommesse
        {
            get { return _scommesse; }
        }

        public BetCard(Cliente cliente, string pin)
        {
            Cliente = cliente;
            // Autogenera il codice della BetCard
            CodiceTessera = GetNextId().ToString(CultureInfo.InvariantCulture);
            Pin = pin;
            Credito = 5.0F;
            _scommesse = new List<ScommessaController>();
            //Bloccata = false;
            TentativiErrati = 0;
        }

        public BetCard(Cliente cliente, string pin, float credito)
            : this(cliente, pin)
        {
            Credito = credito;
        }

        public string CodiceTessera { get; set; }
        public float Credito { get; set; }
        public bool Bloccata { get; set; }
        public string Pin { get; set; }
        public Cliente Cliente { get; set; }

        public void AddScommessa(ScommessaController scommessaController)
        {
            if (scommessaController == null) throw new ArgumentNullException("scommessaController");
            _scommesse.Add(scommessaController);
        }

        public int TentativiErrati { get; private set; }

        public bool VerificaPin(String pin)
        {
            if (Bloccata) throw new InvalidOperationException("tessera bloccata");
            if (Pin.Equals(pin))
                return true;

            TentativiErrati++;
            if (TentativiErrati >= 3)
                Bloccata = true;
            DataSaver.SaveBetCardOnFile(this);
            return false;
        }

        public void RicaricaCredito(float importo)
        {
            Credito += importo;
        }

        private static int GetNextId()
        {
            // Ottieni tutti i nomi delle BetCard
            var listaBetCard = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.betCard");
            // Inizializza lista di identificativi numerici
            var idList = new List<int>();
            // Popola la lista di id (scarta le betcard non numeriche. Esempio: admin, etc..)
            foreach (string s in listaBetCard)
            {
                int lastId;
                if (int.TryParse(s.Split('\\')[s.Split('\\').Length - 1].Replace(".betCard", ""), out lastId))
                    idList.Add(lastId);
            }
            // Ordina la lista numerica
            idList.Sort();
            // Restituisce un Id consecutivo all'ultimo
            return idList.Count.Equals(0) ? 1 : idList[idList.Count - 1] + 1;
        }
    }
}